package br.com.vm.dijkstra.util;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

import br.com.vm.dijkstra.graph.Aresta;
import br.com.vm.dijkstra.graph.Vertice;
import br.com.vm.model.Mapa;
import br.com.vm.model.Rota;

public class DijkstraUtil {

	public static Set<Vertice> prepararVerticesDoMapa(final Mapa poMapa)
			throws Exception {

		Set<Vertice> sVertices = new HashSet<>();

		for (Rota rota : poMapa.getRotas()) {
			Vertice origem = new Vertice(rota.getOrigem().toUpperCase());
			Vertice destino = new Vertice(rota.getDestino().toUpperCase());

			if (!sVertices.contains(origem)) {
				sVertices.add(origem);
			}

			if (!sVertices.contains(destino)) {
				sVertices.add(destino);
			}

			for (Vertice vertice : sVertices) {
				if (vertice.equals(origem)) {
					origem = vertice;
				} else if (vertice.equals(destino)) {
					destino = vertice;
				}
			}

			if (null == origem.getAdjacentes()) {
				origem.setAdjacentes(new ArrayList<Aresta>());
			}
			origem.getAdjacentes()
					.add(new Aresta(destino, rota.getDistancia()));

		}
		return sVertices;
	}

	public static Vertice obterVerticePeloNome(Set<Vertice> psVerticesDoMapa,
			String psPontoDeOrigem) {
		for (Vertice vertice : psVerticesDoMapa) {
			if (vertice.getNomeNoh().equalsIgnoreCase(psPontoDeOrigem)) {
				return vertice;
			}
		}
		return null;
	}
}
